import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, classification_report

# 题目：现有一箱苹果的数据集，有17个样本，每个样本两个特征，为x1和x2，y代表苹果种类，1代表优质苹果，0代表劣质苹果，要求分别利神经网络底层（激活函数用逻辑回归函数）和逻辑回归调库来实现对数据集的分类预测。数据集如下：
X1 = [0.697,0.774,0.634,0.608,0.556,0.403,0.481,0.437,0.666,0.243,0.245,0.343,0.639,0.657,0.360,0.593,0.719]
X2 = [0.460,0.376,0.264,0.318,0.215,0.237,0.149,0.211,0.091,0.267,0.057,0.099,0.161,0.198,0.370,0.042,0.103]
Y = [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0]
# 先底层实现神经网络模型 神经网络结构自定，激活函数为逻辑回归
# 具体要求和评分标准如下：
#
# ①　定义数据集   5分
# ②　引入相关包     5分
# ③　数据初始化（预处理）     5分
# ④　数据洗牌   5分
# ⑤　数据集切分（训练集：测试集=7：3）    5分
# ⑥　自定义逻辑回归函数    5分
# ⑦　自定义方法实现前向传播    5分
# ⑧　自定义方法实现代价   5分
# ⑨　实现后向传播  5分
# ⑩　实现梯度下降 学习率0.1  最大迭代次数10000  5分
# 11　自定义方法实现准确率的计算   5分
# 12　主函数实现模型训练   5分
# 13　画出代价曲线    5分
# 14　实现对测试集的预测    5分
# 15　输出测试集上的准确率    5分
# 对上述数据集利用逻辑回归库函数实现预测
# 16　写出库函数模型 最大迭代次数为5000 ，学习率自定  5分
model = LogisticRegression(max_iter=5000, solver='liblinear')

# 17　在训练集上进行训练   5分
x = np.c_[X1, X2]
y = np.array(Y)
m = len(x)
np.random.seed(666)
rnd_idx = np.random.permutation(m)
x = x[rnd_idx]
y = y[rnd_idx]

# mu = np.mean(x, axis=0)
# sigma = np.std(x, axis=0)
# x -= mu
# x /= sigma
m_train = int(0.7 * m)
x_train, x_test = np.split(x, [m_train])
y_train, y_test = np.split(y, [m_train])
x_train, x_test = x, x  # work-around to fit warnings
y_train, y_test = y, y  # work-around to fit warnings
model.fit(x_train, y_train)

# 18　在测试集上预测 并输出预测值 5分
h_test = model.predict(x_test)
print(f'Hypothesis: {h_test}')

# 19　输出测试集准确率  5分
print(f'Score in test: {model.score(x_test, y_test)}')

# 20　输出混淆矩阵和分类报告，全输出得满分，少一项得此问得0分   5分
print(confusion_matrix(y_test, h_test))
print(classification_report(y_test, h_test))
